﻿using Common;
using SnakeGame.Properties;
using System;
using System.Windows.Forms;

namespace SnakeGame {
    // 主窗口
    public partial class MainWindow: Form, Game.Callback {
        private Game mGame; // 游戏

        /**
         * 构造方法。
         */
        public MainWindow() {
            // 初始化控件
            this.InitializeComponent();

            // 创建游戏区域
            GameBoard gameBoard = new GameBoard(Controls, 0, ToolBar.Height + 1, Const.GAME_BOARD_WIDTH, Const.GAME_BOARD_HEIGHT);

            // 创建游戏
            mGame = new Game(this, gameBoard.Drawer, gameBoard);
        }

        /**
         * "帮助"按钮的单击响应方法。
         * @param sender    事件发送者
         * @param e         事件相关信息
         */
        private void ButtonHelp_Click(object sender, EventArgs e) {
            MessageBox.Show(Resources.IDS_HELP_TEXT, " ", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        /**
         * "播放音乐"按钮的单击响应方法。
         * @param sender    事件发送者
         * @param e         事件相关信息
         */
        private void ButtonMusic_Click(object sender, EventArgs e) {
            ButtonMusic.Checked = mGame.PlayMusic();
        }

        /**
         * "暂停"按钮的单击响应方法。
         * @param sender    事件发送者
         * @param e         事件相关信息
         */
        private void ButtonPause_Click(object sender, EventArgs e) {
            mGame.Pause();
            ButtonPause.Checked = mGame.CurrentStatus == Game.Status.PAUSED;
        }

        /**
         * "开始"按钮的单击响应方法。
         * @param sender    事件发送者
         * @param e         事件相关信息
         */
        private void ButtonStart_Click(object sender, EventArgs e) {
            // 游戏开始
            mGame.Start();

            // 设置按钮状态
            ButtonPause.Enabled = true;
            ButtonPause.Checked = false;

            // 设置状态栏上的文字
            LabelDifficulty.Text = Resources.IDS_DIFFICULTY + 1;
            LabelScore.Text = Resources.IDS_SCORE + 0;
        }

        /**
         * 窗口不活动事件的响应方法。
         * @param sender    事件发送者
         * @param e         事件相关信息
         */
        private void OnDeactivate(object sender, EventArgs e) {
            if (mGame.CurrentStatus == Game.Status.PLAYING) {
                this.ButtonPause_Click(sender, e);
            }
        }

        /**
         * 难度增加事件的响应方法。
         * @param difficulty   难度
         */
        public void OnDifficultyUp(int difficulty) {
            LabelDifficulty.Text = Resources.IDS_DIFFICULTY + difficulty.ToString();
        }

        /**
         * 游戏结束事件的响应方法。
         * @param isWon  胜利则为 true，否则为 false
         */
        public void OnGameOver(bool isWon) {
            if (isWon) {
                MessageBox.Show(Resources.IDS_WON, " ", MessageBoxButtons.OK, MessageBoxIcon.Information);
            } else {
                MessageBox.Show(Resources.IDS_LOST, " ", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

            ButtonPause.Checked = false;
            ButtonPause.Enabled = false;
        }

        /**
         * 得分事件的响应方法。
         * @param score    分数
         */
        public void OnScore(int score) {
            LabelScore.Text = Resources.IDS_SCORE + score.ToString();
        }

       /**
         * 按键事件的响应方法。
         * @param msg   事件
         * @param key   按键
         * @return 事件在此被处理则返回 true，否则返回 false
         */
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
            return mGame.OnKeyPressed(keyData);
        }
    }
}
